package com.whl.system.service.impl;

import com.whl.system.domain.Menu;
import com.whl.system.mapper.MenuMapper;
import com.whl.system.service.IMenuService;
import com.whl.basic.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 业务实现类：
 */
@Service
public class MenuServiceImpl extends BaseServiceImpl<Menu> implements IMenuService {

    @Autowired
    private MenuMapper menuMapper;

    /**
     * 查询菜单树
     * @return
     */
    @Override
    public List<Menu> menuTree() {
        // 1. 一次性查询出所有数据，放到内存中，可以使用map
        // 2. 从所有数据中找出第一层级/顶级菜单：这就是我们需要返回的数据
        // 3. 遍历所有菜单只要不是第一层级的，找自己的上级，并将自己放入上级的children中

        // 查询所有的菜单
        List<Menu> all = menuMapper.findAll();
        // 声明一个map集合
        Map<Long,Menu> map = new HashMap<>();
        // 遍历
        for (Menu menu : all) {
            // 将老菜单放入map中
            map.put(menu.getId(), menu);
        }

        // 前端需要得到的集合数据 - 菜单树
        List<Menu> menuTree = new ArrayList<>();
        // 遍历
        for (Menu menu : all) {
            if(menu.getParentId() == null){ // 顶级菜单
                // 封装到菜单树
                menuTree.add(menu);
            }else { // 不是顶级菜单
                // 获取父菜单的id
                Long parentId = menu.getParentId();
                // 根据父id从map中去获取父菜单 - 以前装进去的对象还是会存在
                Menu parentMenu = map.get(parentId);
                // 将自己装到父菜单的children中
                parentMenu.getChildren().add(menu);
            }
        }
        // 返回菜单树
        return menuTree;
    }
}
